Python默认参数有坑???
最近有小伙伴在面试中遇到了“关于函数默认参数的坑”的题目,少数伙伴对此问题理得不是太清楚,今天汇智妹请到汇智动力高级教师邓老师为大家详细讲解一下,帮助不太清楚的小伙伴清晰的梳理一遍。邓老师本次主要从以下三点来讲解:
- 什么是默认参数?
- 函数默认参数的坑是什么?
- 函数默认参数为什么会有坑?
一、什么是默认参数
python为了简化函数的调用,提供了默认参数机制,举个例:

这样在调用函数时,就可以不写省略的参数。
在定义有默认参数的函数时,需要注意以下两个方面:
1.必选参数必须在前面,默认参数在后;
2.设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数。
二、函数默认参数的坑是什么?
当默认参数使用List时就是个坑,引用一个例子如下:

预期返回的结果应该是:
[0,1]
[0,1,2]
然而实际结果是:

三、函数默认参数为什么会有坑?
要弄清函数默认参数为什么会有坑,需要知道参数可变与不可变的区别。当默认参数指向可变类型对象和不可变类型对象时,会表现出不同的行为。
可变默认参数的表现同上个示例,不可变默认参数的变化情况,看以下示例:

输出的结果是:

由此结果可以看出,第二次调用时默认参数b不会受第一次调用的影响,因为在函数里面进行计算后,b实际是指向了另外一个对象。而函数使用默认参数时,b指向的还是定义函数时,为b分配的内存地址,这个地址的值是没有改变的。
也就是说,在定义函数默认参数时,解释器会为其参数分配一个地址,且不管是第几次调用,默认值的地址都不会改变,当b的默认值为列表时,b的id就已经定了,后面再用到此默认值,就会使用改变后的结果。